import axios from "axios";

import nProgress from "nprogress";
import "nprogress/nprogress.css";

import store from "@/store";

const request = axios.create({
  baseURL: process.env.VUE_APP_API,
  timeout: 10000,
});

// 请求拦截器(处理失败的回调函数会有两种触发方式：1.多个请求拦截器，前一个报错会触发后一个的失败回调 2.传递参数主动触发)
request.interceptors.request.use(
  (config) => {
    nProgress.start();
    // 配置用户临时标识，在用户未登录的状态下，所有有关的数据操作先关联到该临时 id 上，等登录后合并数据
    config.headers.userTempId = store.state.user.userTempId;
    // 用户 token，用户登录状态的标识，所有有关的数据操作直接关联到该 token
    config.headers.token = store.state.user.token;
    return config;
  },
  (error) => {
    nProgress.done();
    // 在 axios 的语法中，该回调函数类似于 promise 的 then() 要在 then() 中返回一个失败的 promise : 1.抛出异常 2.返回一个失败 promise 实例
    return Promise.reject(error.message);
  }
);

// 响应拦截器
request.interceptors.response.use(
  (res) => {
    nProgress.done();
    if (res.data.code !== 200) {
      return Promise.reject({ message: res.data.message });
    }
    return res.data.data;
  },
  (error) => {
    nProgress.done();
    return Promise.reject(error.message);
  }
);

export default request;
